#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

#define high 25     //定义游戏画面尺寸
#define width 30
//让某块区域有水源，在这更易于繁殖，按＋键加速演化按-减速，按ESC暂停
//按R重新开始
//全局变量命名
int m,n;
int pause;
int cell[high][width];
int water_x_u,water_x_d,water_y_l,water_y_r;    //水源区
int neibour;

void gotoxy(int x,int y)
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X=x;
    pos.Y=y;
    SetConsoleCursorPosition(handle,pos);
}

void HideCursor()          //隐藏光标
{
    CONSOLE_CURSOR_INFO cursor_info={1,0};//第二个值为0表示隐藏光标
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}

void start()              //数据初始化
{
    int i,j;
    for(i=0;i<high;i++)
        for(j=0;j<width;j++)
            cell[i][j]=rand()%2;

    water_x_d=14;   //水源位置
    water_x_u=14;
    water_y_l=2;
    water_y_r=2;

    neibour=3;  //细胞周围容纳邻居个数

    pause=0;

    HideCursor();    //隐藏光标
}

void show()         //显示画面
{
    int i,j;

    gotoxy(0,0);//光标移动到原点位置，以下重画清屏

    for(i=0;i<=high;i++)
    {
        for(j=0;j<=width;j++)
        {
            if(cell[i][j]==1)
                printf("*");
            else
                printf(" ");
        }
        printf("\n");
    }
    Sleep(50);
}


void update_without_input() //与用户输入无关的
{
    int i,j;
    int tempcell[high][width];//临时存储二维数组
    int neibourNum=0;
    int neibour_water=neibour;

    for(i=0;i<high;i++)
        for(j=0;j<width;j++)
                tempcell[i][j]=cell[i][j];  //记录细胞生死状态

    for(i=1;i<high-1;i++){          //计数周围活细胞个数
        for(j=1;j<width-1;j++){
            neibourNum=cell[i-1][j+1]+cell[i-1][j]
                      +cell[i-1][j-1]+cell[i][j+1]+cell[i][j-1]
                      +cell[i+1][j-1]+cell[i+1][j]+cell[i+1][j+1];

            if((i<=water_x_d && i>=water_x_u)&&(j>=water_y_l && j<=water_y_r))
                neibour_water=neibour+1;              //如果在水源范围内

            if(neibourNum==neibour || neibourNum==neibour_water)       //执行周围细胞对该细胞的影响
                tempcell[i][j]=1;
            else if(neibourNum==2)
                tempcell[i][j]=cell[i][j];
            else
                tempcell[i][j]=0;
        }
    }

    for(i=0;i<high;i++)     //
        for(j=0;j<width;j++)
            cell[i][j]=tempcell[i][j];  //返还该细胞生死状态
}

/*void update_with_input()
{
    char input;

    if(kbhit())//当用户按键时执行
    {
        input=getch();
                //执行暂停和继续功能
        if(input==27)
        {
            pause=1;
        }
        if(input=='R'){
            pause=0;
        }
                //杆的移动
        if(input=='+'){
            neibour=2;
        }
        if(input=='-'){
            neibour=4;
        }
    }
}*/
int main()
{
    start();
    while(1)
    {
        start();
        if(pause==0)//执行继续功能
        {
            show();
            update_without_input();
        }
        // update_with_input();
    }
    return 0;
}